<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\facade\Db;
use app\service\TopviewApiService;

class RetryText2VoiceTasks extends Command
{
    protected function configure()
    {
        $this->setName('retry:text2voice-tasks')
            ->setDescription('重新处理失败的文字转语音任务（status=3）');
    }

    protected function execute(Input $input, Output $output)
    {
        $output->writeln('开始重新处理失败的文字转语音任务...');

        $apiService = new TopviewApiService();
        $retryCount = 0;
        $successCount = 0;
        $failCount = 0;

        try {
            // 查询状态为3（失败）的文字转语音任务
            $failedTasks = Db::name('text2voice_tasks')
                ->where('status', 3)
                ->where('text', '<>', '')
                ->where('text', 'not null')
                ->where('voice_id', '<>', '')
                ->where('voice_id', 'not null')
                ->select();

            if (empty($failedTasks)) {
                $output->writeln('没有找到需要重新处理的文字转语音任务');
                return 0;
            }

            $output->writeln("找到 " . count($failedTasks) . " 个失败的文字转语音任务");

            foreach ($failedTasks as $task) {
                try {
                    $output->writeln("重新处理任务 ID: {$task['id']}, 用户ID: {$task['user_id']}, 文本: " . mb_substr($task['text'], 0, 50) . "...");
                    
                    // 准备重新提交的参数
                    $params = [
                        'voiceText' => $task['text'],
                        'voiceId' => $task['voice_id']
                    ];

                    // 重新提交文字转语音任务
                    $result = $apiService->submitText2VoiceTask($params);
                    
                    $taskId = $result['taskId'] ?? ($result['result']['taskId'] ?? '');
                    
                    if (!empty($taskId)) {
                        // 更新任务状态为处理中，并更新task_id
                        Db::name('text2voice_tasks')
                            ->where('id', $task['id'])
                            ->update([
                                'task_id' => $taskId,
                                'status' => 1, // 重新设置为处理中
                                'error_msg' => null, // 清除之前的错误信息
                                'update_time' => date('Y-m-d H:i:s')
                            ]);
                        
                        $output->writeln("任务 {$task['id']} 重新提交成功，新任务ID: {$taskId}");
                        $successCount++;
                    } else {
                        throw new \Exception('API返回结果中没有taskId');
                    }
                    
                    $retryCount++;
                    
                    // 避免请求过于频繁，添加短暂延迟
                    sleep(1);
                    
                } catch (\Exception $e) {
                    $output->writeln("重新处理任务 {$task['id']} 失败: " . $e->getMessage());
                    
                    // 更新错误信息
                    Db::name('text2voice_tasks')
                        ->where('id', $task['id'])
                        ->update([
                            'error_msg' => '重新处理失败: ' . $e->getMessage(),
                            'update_time' => date('Y-m-d H:i:s')
                        ]);
                    
                    $failCount++;
                }
            }

            $output->writeln("重新处理完成！");
            $output->writeln("总计处理: {$retryCount} 个任务");
            $output->writeln("成功重新提交: {$successCount} 个任务");
            $output->writeln("重新提交失败: {$failCount} 个任务");
            
        } catch (\Exception $e) {
            $output->writeln('重新处理任务时发生错误: ' . $e->getMessage());
            return 1;
        }

        return 0;
    }
}
